import type { CipherMode } from 'sm-crypto';

import { sm2 } from 'sm-crypto';

/**
 * 使用sm2公钥加密数据
 * @param data 待加密的数据
 * @param publicKey 公钥（十六进制格式，支持完整格式和坐标格式）
 * @returns 加密后的数据（十六进制格式）
 */
export const sm2Encrypt = (
  data: string,
  publicKey: string,
  mode: 0 | 1 = 1,
): string => {
  try {
    if (!data || !publicKey) {
      console.error('数据或公钥不能为空');
      return data;
    }

    let actualPublicKey = publicKey;
    // 如果是完整格式的公钥，提取实际的公钥坐标部分
    if (publicKey.startsWith('30')) {
      // 提取公钥坐标部分（假设是uncompressed格式，以"04"开头）
      const prefixIndex = publicKey.indexOf('04');
      if (prefixIndex !== -1) {
        actualPublicKey = publicKey.slice(Math.max(0, prefixIndex));
      }
    }
    const encrypted = sm2.doEncrypt(data, actualPublicKey, mode as CipherMode); // 1 表示 C1C3C2 格式
    return encrypted;
  } catch (error) {
    console.error('SM2加密失败:', error);
    return data;
  }
};
